﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _19_Composite
{
    /*为祝贺中对象声明接口，在适当情况下，实现所有类共有接口的默认行为。
     * 声明一个接口用于访问和管理Component的*/
    abstract class Component
    {
        protected string name;

        public Component(string name)
        {
            this.name = name;
        }

        public abstract void Add(Component c);
        public abstract void Remove(Component c);
        public abstract void Display(int depth);
    }

    /*
     leaf在组合中表示叶节点对象，叶节点没有子节点

        由于叶子节点没有再增加分枝和树叶，所以add和remove 方法实现它没有意义，但这样做可以消除也节点和枝节点对象
        在抽象层次的区别，他们具备完全一致的接口
     */
    class Leaf : Component
    {
        public Leaf(string name) : base(name)
        {}

        public override void Add(Component c)
        {
            Console.WriteLine("Cannot add to a leaf");
        }

        public override void Remove(Component c)
        {
            Console.WriteLine("Cannot remove to a leaf");
        }
        /*叶节点的具体方法，此处是显示器名称和级别*/
        public override void Display(int depth)
        {
            Console.WriteLine(new String('-',depth)+name);
        }
    }

    /*
     定义有枝节点行为，用来存储子部件，在Component 接口中实现与子部件有关的操作，比如增加add 和 删除Remove
         */
    class Composite : Component
    {
        private List<Component> children = new List<Component>();

        public Composite(string name) : base(name)
        { }
        public override void Add(Component c)
        {
            children.Add(c);
        }
        
        public override void Remove(Component c)
        {
            children.Remove(c);
        }

        public override void Display(int depth)
        {
            Console.WriteLine(new String('-', depth) + name);

            foreach (Component component in children)
            {
                component.Display(depth + 2);
            }
        }
    }
}
